package org.uc3m.ed.tad.arbol;

import java.util.NoSuchElementException;

import org.uc3m.ed.tad.ITAD;

/**
 * Definicion del <B>TAD Arbol binario</B>.
 * 
 * </br></br>
 * 
 * La interfaz define las operaciones para el manejo de un arbol binario sin
 * repeticion de elementos.
 * 
 * El arbol proporciona iteradores especificos para permitir el recorrido del
 * arbol en:
 * 
 * <ul>
 * <li>Preorden
 * <li>Inorden
 * <li>Postorden
 * </ul>
 * 
 * @author DEI - ED
 * @version 1.0
 */
public interface IArbolBinario<C extends Comparable<C>, E> extends ITAD<E> {

	/**
	 * Indica si el arbol tiene elementos.
	 * 
	 * @return <code> true </code> Arbol vacio. <code> false </code> En caso
	 *         contrario.
	 */
	public boolean estaVacio();

	/**
	 * Extrae todos los elementos del arbol y elimina el contenido en memoria.
	 */
	public void eliminar();

	/**
	 * Recupera del arbol, pero no elimina, el elemento que ocupa la raiz.
	 * 
	 * @return El elemento que ocupa la raiz.
	 * @throws NoSuchElementException
	 *             No hay elementos en el arbol.
	 */
	public E raiz();

	/**
	 * Recupera el subarbol izquierdo.
	 * 
	 * @return Subarbol izquierdo.
	 * @throws NoSuchElementException
	 *             No hay elementos en el arbol.
	 */
	public IArbolBinario<C, E> subarbolIzquierdo();

	/**
	 * Recupera el subarbol derecho.
	 * 
	 * @return Subarbol derecho.
	 * @throws NoSuchElementException
	 *             No hay elementos en el arbol.
	 */
	public IArbolBinario<C, E> subarbolDerecho();

	/**
	 * Obtiene un iterador sobre los elementos del arbol que realiza el
	 * recorrido en <I>preorden (raiz, subarbol izquierdo, subarbol derecho)</I>
	 * 
	 * @return Iterador sobre el arbol.
	 */
	public IArbolBinarioIterador<C, E> preorden();

	/**
	 * Obtiene un iterador sobre los elementos del arbol que realiza el
	 * recorrido en <I>inorden (subarbol izquierdo, raiz, subarbol derecho)</I>
	 * 
	 * @return Iterador sobre el arbol.
	 */
	public IArbolBinarioIterador<C, E> inorden();

	/**
	 * Obtiene un iterador sobre los elementos del arbol que realiza el
	 * recorrido en <I>postorden (subarbol izquierdo, subarbol derecho, raiz)</I>
	 * 
	 * @return Iterador sobre el arbol.
	 */
	public IArbolBinarioIterador<C, E> postorden();
}
